﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using vudu.Logica.Clases;
using vudu.EnlaceDatos.SqlServer;

namespace vudu.PaginasWeb.G1EsquemaEvaluacion
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        private List<Evaluacion> _misEvaluaciones = new List<Evaluacion>();
        private Profesor profesor = new Profesor();
        private Evaluacion evaluacion = new Evaluacion();

        protected void Page_Load(object sender, EventArgs e)
        {
            //Inicialmente se cargan las secciones del profesor y se llena la tabla de informacion de secciones
            LlenarCabecerasTablaInformacionSecciones();

            //Cuando hagan la integracion quitar la asignacion de a cedula ya que este se pasa pr la variable session
            //luego descomentar la variable session

			
            profesor = (Profesor) Session["usuario"];


            //esto no se quita en la integracion
            InFormacionProfesor.Text = "Profesor(a) : " + profesor.Nombre + " " + profesor.Apellido;
            CargarInformacionTabla();

            //para este caso se verifica si es la primera vez que llega a la pagina
            //de ser correcto guardamos en la session la variable mis seccion, y si no es primera vez que entra
            //se guarda las sessiones agregadas.
            if (Session["evaluacionesAgregadas"] == null)
                Session["evaluacionesAgregadas"] = _misEvaluaciones;
            else
                _misEvaluaciones = (List<Evaluacion>)Session["evaluacionesAgregadas"];
        }

        /// <summary>
        /// Funcion que sirve para insertar las cabeceras a la table de informacion de secciones.
        /// </summary>
        public void LlenarCabecerasTablaInformacionSecciones()
        {
                // Creamos un nuevo registro para la tabla
                TableRow registroTabla = new TableRow();
                InformacionSecciones.Rows.Add(registroTabla);
                // Creamos una celda para esta tabla.
                TableCell celdaTabla = new TableCell();
                celdaTabla.Width = 200;
                celdaTabla.HorizontalAlign = HorizontalAlign.Center;
                registroTabla.Cells.Add(celdaTabla);
                // Creamos un WebControl de tipo "LABEL" y se lo aderimos a la celda.
                System.Web.UI.WebControls.Label labelCabecera = new Label();
                labelCabecera.Text = "Materia";
                celdaTabla.Controls.Add(labelCabecera);

                //Repetimos el procedimiento hasta llenar nuestra tabla.
                celdaTabla = new TableCell();
                celdaTabla.Width = 100;
                celdaTabla.HorizontalAlign = HorizontalAlign.Center;
                registroTabla.Cells.Add(celdaTabla);
                labelCabecera = new Label();
                labelCabecera.Text = "Seccion";
                celdaTabla.Controls.Add(labelCabecera);

                celdaTabla = new TableCell();
                celdaTabla.Width = 200;
                celdaTabla.HorizontalAlign = HorizontalAlign.Center;
                registroTabla.Cells.Add(celdaTabla);
                labelCabecera = new Label();
                labelCabecera.Text = "Opcion";
                celdaTabla.Controls.Add(labelCabecera);
        }

        /// <summary>
        /// Funcion que sirve para insertar las cabeceras a la table de esquemaEvaluacion.
        /// </summary>
        public void LlenarCabecerasTablaEsquemaEvaluacion()
        {
            // Creamos un nuevo registro para la tabla
            TableRow registroTabla = new TableRow();
            EsquemaEvaluacion.Rows.Add(registroTabla);
            // Creamos una celda para esta tabla.
            TableCell celdaTabla = new TableCell();
            celdaTabla.Width = 150;
            celdaTabla.HorizontalAlign = HorizontalAlign.Center;
            registroTabla.Cells.Add(celdaTabla);
            // Creamos un WebControl de tipo "LABEL" y se lo aderimos a la celda.
            System.Web.UI.WebControls.Label labelCabecera = new Label();
            labelCabecera.Text = "Tipo";
            celdaTabla.Controls.Add(labelCabecera);

            //Repetimos el procedimiento hasta llenar nuestra tabla.
            celdaTabla = new TableCell();
            celdaTabla.Width = 150;
            celdaTabla.HorizontalAlign = HorizontalAlign.Center;
            registroTabla.Cells.Add(celdaTabla);
            labelCabecera = new Label();
            labelCabecera.Text = "Nombre";
            celdaTabla.Controls.Add(labelCabecera);

            celdaTabla = new TableCell();
            celdaTabla.Width = 150;
            celdaTabla.HorizontalAlign = HorizontalAlign.Center;
            registroTabla.Cells.Add(celdaTabla);
            labelCabecera = new Label();
            labelCabecera.Text = "Porcentaje";
            celdaTabla.Controls.Add(labelCabecera);

            celdaTabla = new TableCell();
            celdaTabla.Width = 150;
            celdaTabla.HorizontalAlign = HorizontalAlign.Center;
            registroTabla.Cells.Add(celdaTabla);
            labelCabecera = new Label();
            labelCabecera.Text = "Fecha Tentativa";
            celdaTabla.Controls.Add(labelCabecera);
        }

        /// <summary>
        /// Funcion para cargar la informacion de secciones para un profesor en la tabla.
        /// </summary>
        public void CargarInformacionTabla()
        {
            try
            {
                //Variable utilizaa para hacer hacer uso del metodo consultar seccion profesor
                SeccionMateria varibleSeccionMateria = new SeccionMateria();
                //Recorremos la lista de todas las secciones de un profesor.
                foreach (SeccionMateria seccionMateria in varibleSeccionMateria.ConsultarSeccionProfesor(profesor.Cedula))
                {
                    // Creamos un nuevo registro para la tabla
                    TableRow registroTabla = new TableRow();
                    InformacionSecciones.Rows.Add(registroTabla);

                    // Creamos una celda para esta tabla.
                    TableCell celdaTabla = new TableCell();
                    registroTabla.Cells.Add(celdaTabla);
                    // Creamos un WebControl de tipo "LABEL" y se lo aderimos a la celda.
                    System.Web.UI.WebControls.Label labelRegistro = new Label();
                    labelRegistro.Text = seccionMateria.Materia.Nombre;
                    celdaTabla.Controls.Add(labelRegistro);

                    celdaTabla = new TableCell();
                    celdaTabla.HorizontalAlign = HorizontalAlign.Center;
                    registroTabla.Cells.Add(celdaTabla);
                    // Creamos un WebControl de tipo "LABEL" y se lo aderimos a la celda.
                    labelRegistro = new Label();
                    labelRegistro.Text = "00" + seccionMateria.Codigo.ToString();
                    celdaTabla.Controls.Add(labelRegistro);

                    celdaTabla = new TableCell();
                    celdaTabla.HorizontalAlign = HorizontalAlign.Center;
                    registroTabla.Cells.Add(celdaTabla);
                    // Creamos un WebControl de tipo "BUTTON" y se lo aderimos a la celda.
                    System.Web.UI.WebControls.Button buttonAgregarEsquema = new Button();
                    buttonAgregarEsquema.CssClass = "boton";
                    buttonAgregarEsquema.Text = "Crear Esquema";
                    buttonAgregarEsquema.ID = seccionMateria.IdSeccionMateria.ToString();
                    buttonAgregarEsquema.Click += new EventHandler(AccionBotonCrearEsquema);
                    celdaTabla.Controls.Add(buttonAgregarEsquema);
                }
            }
            catch (Exception)
            {
                MensajeDeTransaccion.Text = "Operacion Fallida : No se pudo establecer conexion con la Base de Datos";
                MensajeDeTransaccion.CssClass = "transaccionFallida";
                MensajeDeTransaccion.Visible = true;
            }
        }

        /// <summary>
        /// Funcion para cargar la informacion de secciones para un profesor en la tabla.
        /// </summary>
        public void ImprimirEvaluacionesEnTablaEsquemaEvaluacion()
        {
            int iteracion = 0;
            foreach(Evaluacion evaluacion in _misEvaluaciones)
            {
                // Creamos un nuevo registro para la tabla
                TableRow filaTabla = new TableRow();
                EsquemaEvaluacion.Rows.Add(filaTabla);

                // Creamos una celda para esta tabla.
                TableCell celdaTabla = new TableCell();
                filaTabla.Cells.Add(celdaTabla);
                // Creamos un WebControl de tipo "LABEL" y se lo aderimos a la celda.
                System.Web.UI.WebControls.Label label = new Label();
                label.Text = evaluacion.TipoEvaluacion;
                celdaTabla.Controls.Add(label);

                celdaTabla = new TableCell();
                celdaTabla.HorizontalAlign = HorizontalAlign.Center;
                filaTabla.Cells.Add(celdaTabla);
                // Creamos un WebControl de tipo "LABEL" y se lo aderimos a la celda.
                label = new Label();
                label.Text = evaluacion.Nombre;
                celdaTabla.Controls.Add(label);

                celdaTabla = new TableCell();
                celdaTabla.HorizontalAlign = HorizontalAlign.Center;
                filaTabla.Cells.Add(celdaTabla);
                // Creamos un WebControl de tipo "LABEL" y se lo aderimos a la celda.
                label = new Label();
                label.Text = evaluacion.Porcentaje.ToString();
                celdaTabla.Controls.Add(label);

                celdaTabla = new TableCell();
                celdaTabla.HorizontalAlign = HorizontalAlign.Center;
                filaTabla.Cells.Add(celdaTabla);
                // Creamos un WebControl de tipo "LABEL" y se lo aderimos a la celda.
                label = new Label();
                label.Text = evaluacion.FechaEvaluacion.ToString().Split(' ')[0];
                celdaTabla.Controls.Add(label);
            }
        }

        /// <summary>
        /// Con este metodo se agregan nuevas evaluaciones a la lista de esquema de evaluacion
        /// </summary>
        public void NuevaEvaluacion()
        {
            Evaluacion evaluacion = new Evaluacion();
            evaluacion.TipoEvaluacion = TipoEvaluacion.Text;
            evaluacion.Nombre = NombreEvaluacion.Text;
            evaluacion.Porcentaje = Convert.ToInt32(PorcentajeEvaluacion.Text);
            evaluacion.FechaEvaluacion = Convert.ToDateTime(FechaTentativa.Text);
            _misEvaluaciones.Add(evaluacion);
        }

        /// Ejecuta la accion del boton para crear nuevo esquema de evaluacion
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void AccionBotonCrearEsquema(Object sender,EventArgs e)
        {
            //Convertimos el objeto enviado en boton, para poder obtener su id.
            Button clickedButton = (Button)sender;
            //Ocultamos el panel del primer paso, y mostramos el que permite crear el esquema de evaluacion.
            PanelPrimerPaso.Visible = false;
            PanelSegundoPaso.Visible = true;
            LlenarCabecerasTablaEsquemaEvaluacion();
            //En la session se agrega la informacion acerca del id al cual se le va a agregar un esquema de evaluacion
            Session["idSeccionEnBD"] = Convert.ToInt32(clickedButton.ID);
        }

        /// <summary>
        /// Funcion que agrega la evaluacion a la tabla de evaluacion
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void AgregarEvaluacion(object sender, EventArgs e)
        {
            if (ValidarFormulario())
            {
                NuevaEvaluacion();
                VaciarInformacionFormulario();
            }
            LlenarCabecerasTablaEsquemaEvaluacion();
            ImprimirEvaluacionesEnTablaEsquemaEvaluacion();
        }

        #region Funciones utilizadas para validar informacion del formulario
        /// <summary>
        /// Funcion que valida que la informacion del formulario este correcta
        /// </summary>
        /// <returns></returns>
        public bool ValidarFormulario()
        {
            ValidarCampoNombreEvaluacion();
            ValidarCampoPorcentajeEvaluacion();
            ValidarCampoFechaTentativa();
            if (ValidarCampoNombreEvaluacion() && ValidarCampoPorcentajeEvaluacion() && ValidarCampoFechaTentativa())
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// Funcion que valida si la informacion de Campo porcentaje evaluacion es correcta.
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCampoPorcentajeEvaluacion()
        {
            if (PorcentajeEvaluacion.Text.Length == 0)
            {
                MensajePorcentajeEvaluacion.Text = "Este campo es obligatorio";
                MensajePorcentajeEvaluacion.Visible = true;
                return false;
            }
            else if (!ValidarSiEsNumero(PorcentajeEvaluacion.Text))
            {
                MensajePorcentajeEvaluacion.Text = "Este campo no puede contener letras";
                MensajePorcentajeEvaluacion.Visible = true;
                return false;
            }
            else
            {
                MensajePorcentajeEvaluacion.Visible = false;
                return true;
            }
        }

        public bool ValidarSiEsNumero(string numero)
        {
            try
            {
                Convert.ToInt32(numero);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// Metodo que valida que un campo realmente sea una fecha
        /// </summary>
        /// <param name="numero"></param>
        /// <returns>retorna true si es fecha, false si no es.</returns>
        public bool ValidarCampoFechaTentativa()
        {
            if (FechaTentativa.Text.Length == 0)
            {
                MensajeFechaTentativa.Text = "Este campo es obligatorio";
                MensajeFechaTentativa.Visible = true;
                return false;
            }
            else if (!ValidarSiEsFecha(FechaTentativa.Text))
            {
                MensajeFechaTentativa.Text = "La fecha no esta en el formato correcto";
                MensajeFechaTentativa.Visible = true;
                return false;
            }
            else
            {
                MensajeFechaTentativa.Visible = false;
                return true;
            }
        }

        public bool ValidarSiEsFecha(string fecha)
        {
            try
            {
                Convert.ToDateTime(fecha);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// Funcion que valida si la informacion de Campo nombre evaluacion es correcta.
        /// </summary>
        /// <param name="nombreEvaluacion"></param>
        /// <returns>retorna true si es, false caso contrario.</returns>
        public bool ValidarCampoNombreEvaluacion()
        {
            if (NombreEvaluacion.Text.Length == 0)
            {
                MensajeNombreEvaluacion.Visible = true;
                return false;
            }
            else
            {
                MensajeNombreEvaluacion.Visible = false;
                return true;
            }
        }

        #endregion

        /// <summary>
        /// metodo utilizado para que luego de agregada la evaluacion el formulario quede vacio 
        /// Ó al presionar el boton limpiar formulario
        /// </summary>
        public void VaciarInformacionFormulario()
        {
            NombreEvaluacion.Text = PorcentajeEvaluacion.Text = FechaTentativa.Text = "";
        }

        /// <summary>
        /// Funcion que crea el esquema de evaluacion en base de datos.
        /// </summary>
        public void CrearEsquemaEvaluacion(object sender, EventArgs e)
        {
            try
            {
                foreach (Evaluacion evaluacionLista in _misEvaluaciones)
                {
                    evaluacionLista.FkIdSeccion = (int)Session["idSeccionEnBD"];
                    evaluacion.InsertarEvaluacion(evaluacionLista);

                }
                MensajeDeTransaccion.Text = "El esquema de evaluacion se agrego con exito";
                MensajeDeTransaccion.CssClass = "transaccionExitosa";
                MensajeDeTransaccion.Visible = true;
                Session["idSeccionEnBD"] = null;
                Session["evaluacionesAgregadas"] = null;
            }
            catch (Exception)
            {
                MensajeDeTransaccion.Text = "Operacion Fallida";
                MensajeDeTransaccion.CssClass = "transaccionFallida";
                MensajeDeTransaccion.Visible = true;
            }
        }
    }
}